import java.io.*;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: wx
 * Date: 2024-03-12
 * Time: 16:00
 */
// 还是在目录中搜索,按照文件内容的方式搜索
// 用户输入一个目录,一个要搜索的词
// 遍历文件的过程中,如果包含了要搜索的词,此时就把文件的路径打印出来
//                      这一过程中,就需要把文件内容读取出来,再在文件内容中进行查找/
public class IODemo15 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要搜索的路径: ");
        String rootPath = scanner.next();
        System.out.println("请输入要查询的词: ");
        String word = scanner.next();

        File rootFile = new File(rootPath);
        if (rootFile.isDirectory()) {
            System.out.println("输入的要搜索的路径不正常");
            return;
        }

        scanDir(rootFile, word);
    }
    private static void scanDir(File rootFile, String word){
        File[] files = rootFile.listFiles();
        if (files == null) {
            return;
        }
        for (File f: files) {
            System.out.println("当前遍历到: " + f.getAbsolutePath());
            if (f.isFile()) {
                // 在文件内容中搜索
                searchInFile(f, word);
            } else if (f.isDirectory()) {
                // 递归遍历
                scanDir(f,word);
            }else {
                //暂时不需要
            }
        }
    }

    private static void searchInFile(File f, String word) {
        // 通过这个方法在文件内部搜索
        // 1.把文件内容读取出来
        // /
        try(InputStream inputStream = new FileInputStream(f)){
            StringBuilder stringBuilder = new StringBuilder();
         while(true) {
             byte[] buffer = new byte[1024];
             int n = inputStream.read(buffer);
             //这里只读取出文件的一部分,需要把文件内容整体拼接在一起
             if (n == -1) {
                break;
             }
             String s = new String(buffer);
             stringBuilder.append(s);
         }
         //当文件读取完毕,循环结束之后,此时 stringBuiler 就是包含文件整个内容的字符串了

            //判断word是否是在 stringBuilde 中存在.
            if (stringBuilder.indexOf(word) != -1) {
                return;
            }
            //找到了,打印文件的路径
            System.out.println("找到了! word " + word + "存在于 " + f.getAbsolutePath());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
